home *** CD-ROM | disk | FTP | other *** search
- (*===========================================================================*)
- (* Long String Service routines *)
- (* *)
- (* Copyright 1988, 1989 by H. Roy Engehausen. All rights reserved. *)
- (* This software may be freely distributed and used, but it may not *)
- (* under any circumstances be sold by anyone other than the author. *)
- (* It may be distributed by a commercial company as long as it is *)
- (* for no cost. *)
- (* *)
- (*===========================================================================*)
-
- {$R-}
-
- UNIT BBLSTR;
-
- INTERFACE
-
- USES
- bbdummy;
-
- FUNCTION l_pos (a : str_mixed_ptr; look_for : CHAR) : WORD;
- PROCEDURE l_cat (a : str_mixed_ptr; b : str_mixed_ptr);
- PROCEDURE l_cat_size (a : str_mixed_ptr; b : str_mixed_ptr; c : INTEGER);
- PROCEDURE l_cat_str (a : str_mixed_ptr; VAR b : string);
- PROCEDURE l_cat_str_size (a: str_mixed_ptr; VAR b : string; c : INTEGER);
- PROCEDURE l_move_str (a : str_mixed_ptr; b : string);
- FUNCTION l_substr (a : str_mixed_ptr; start_pos : WORD; len_pos : WORD)
- : str_mixed_ptr;
-
- (*---------------------------------------------------------------------------*)
- (* Ok! Let's start work. *)
- (*---------------------------------------------------------------------------*)
-
- IMPLEMENTATION
-
- USES
- bbstack;
-
- {$I BBMACRO.PAS}
-
- {$UNDEF DEBUG}
-
- VAR result_holder : str_mixed;
-
- FUNCTION l_pos (a : str_mixed_ptr; look_for : CHAR) : WORD;
-
- VAR
- i : WORD;
-
- BEGIN;
-
- {$IFDEF DEBUG}
- stack_depth;
- {$ENDIF}
-
- i := 0;
-
- WHILE i < a^.long_length DO
- BEGIN;
- INC(i);
- IF a^.long_data[i] = look_for THEN
- BEGIN;
- l_pos := i;
- EXIT;
- END;
- END;
-
- l_pos := 0;
-
- EXIT;
-
- END;
-
- PROCEDURE l_cat( a : str_mixed_ptr; b : str_mixed_ptr);
-
- VAR
- i : WORD;
- j : WORD;
-
- BEGIN;
-
- i := a^.long_length;
- j := b^.long_length;
-
- IF (j = 0) OR (i >= SIZEOF(a^.long_data)) THEN
- EXIT;
-
- IF (i + j) > SIZEOF(a^.long_data) THEN
- j := SIZEOF(a^.long_data) - i;
-
- MOVE(b^.long_data, a^.long_data[i+1], j);
- a^.long_length := i + j;
-
- a^.str_data[0] := CHR(min_w(255, a^.long_length));
-
- i := b^.long_length - j;
- IF i > 0 THEN
- MOVE(b^.long_data[j+1], b^.long_data[1], i);
- b^.long_length := i;
-
- b^.str_data[0] := CHR(min_w(255, b^.long_length));
-
- END;
-
- PROCEDURE l_cat_size (a : str_mixed_ptr; b : str_mixed_ptr; c : INTEGER);
-
- VAR
- i : WORD;
- j : WORD;
-
- BEGIN;
-
- i := a^.long_length;
- j := b^.long_length;
-
- IF (j = 0) OR (i >= SIZEOF(a^.long_data)) THEN
- EXIT;
-
- IF (i + j) > c THEN
- j := c - i;
-
- MOVE(b^.long_data, a^.long_data[i+1], j);
- a^.long_length := i + j;
-
- a^.str_data[0] := CHR(min_w(255, a^.long_length));
-
- i := b^.long_length - j;
- IF i > 0 THEN
- MOVE(b^.long_data[j+1], b^.long_data[1], i);
- b^.long_length := i;
-
- b^.str_data[0] := CHR(min_w(255, b^.long_length));
-
- END;
-
- PROCEDURE l_cat_str( a : str_mixed_ptr; VAR b : string);
-
- VAR
- i : WORD;
- j : WORD;
-
- BEGIN;
-
- i := a^.long_length;
- j := LENGTH(b);
-
- IF (j = 0) OR (i >= SIZEOF(a^.long_data)) THEN
- EXIT;
-
- IF (i + j) > SIZEOF(a^.long_data) THEN
- j := SIZEOF(a^.long_data) - i;
-
- MOVE(b[1], a^.long_data[i+1], j);
- a^.long_length := i + j;
- a^.str_data[0] := CHR(min_w(255, a^.long_length));
-
- i := LENGTH(b) - j;
- IF i > 0 THEN
- MOVE(b[j+1], b[1], i);
- b[0] := CHR(i);
-
- END;
-
- PROCEDURE l_cat_str_size (a: str_mixed_ptr; VAR b : string; c : INTEGER);
-
- VAR
- i : WORD;
- j : WORD;
-
- BEGIN;
-
- WITH a^ DO
- BEGIN;
-
- i := long_length;
- j := LENGTH(b);
-
- IF (j = 0) OR (i >= SIZEOF(long_data)) THEN
- EXIT;
-
- IF (i + j) > c THEN
- IF c >= i THEN
- j := c - i
- ELSE
- j := 0;
-
- MOVE(b[1], long_data[i+1], j);
- long_length := i + j;
-
- i := LENGTH(b) - j;
- IF i > 0 THEN
- MOVE(b[j+1], b[1], i);
- b[0] := CHR(i);
-
- a^.str_data[0] := CHR(min_w(255, a^.long_length));
-
- IF i <= 255 THEN
- b[0] := CHR(i)
- ELSE
- b[0] := CHR(255);
-
- END;
-
- END;
-
- PROCEDURE l_move_str( a : str_mixed_ptr; b : string);
-
- VAR
- i : WORD;
- j : WORD;
-
- BEGIN;
-
- i := LENGTH(b);
- a^.long_length := i;
-
- MOVE(b[0], a^.str_data[0], i + 1);
-
- END;
-
- FUNCTION l_substr( a : str_mixed_ptr; start_pos : WORD; len_pos : WORD) :
- str_mixed_ptr;
-
- BEGIN;
-
- l_substr := @result_holder;
-
- IF start_pos > a^.long_length THEN
- BEGIN;
- result_holder.long_length := 0;
- EXIT
- END;
-
- IF len_pos = 0 THEN
- len_pos := a^.long_length - start_pos + 1;
-
- result_holder.long_length := len_pos;
- result_holder.str_data[0] := CHR(min_w(255, len_pos));
-
- MOVE(a^.long_data[start_pos], result_holder.long_data[1], len_pos);
-
- END;
-
- END.